var express = require('express');
var router = express.Router();
const pool = require('../model/db')
const {getUser,getUserByUsername}=require('../model/data')
const puppeteer = require('puppeteer');
const path = require('path'); // 添加这行
const fs = require('fs');
/* GET home page. */
// 生成完整 HTML 的函数（包含前端虚拟列表样式）
function generateFullHtml(data) {
  return `
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>课程数据截图</title>
      <style>
        /* 完全复制前端样式（含虚拟列表布局） */
        .virtual-list {
          width: 100%;
          max-width: 1000px;
          margin: 0 auto;
          position: relative;
          overflow-y: auto;
          background-color: #fff;
          border: 1px solid #e5e7eb;
          border-radius: 8px;
          box-shadow: 0 2px 12px rgba(0,0,0,0.05);
          height: ${data.length * 60}px; /* 假设 itemHeight 固定为 60px */
        }

        .virtual-list-placeholder {
          display: none; /* 后端无需占位元素，直接渲染全部内容 */
        }

        .virtual-list-content {
          width: 100%;
          position: absolute; /* 与前端一致的绝对定位 */
          top: 0;
          left: 0;
          box-sizing: border-box;
        }

        .virtual-list-ul {
          list-style: none;
          padding: 0;
          margin: 0;
        }

        .virtual-list-item {
          box-sizing: border-box;
          width: 100%;
          height: 60px; /* 固定 itemHeight，与前端默认值一致 */
          padding: 12px 16px;
          border-bottom: 1px solid #f0f0f0;
          font-size: 14px;
          display: flex;
          justify-content: space-between;
          align-items: center;
          transition: all 0.2s ease;
        }

        .virtual-list-item:hover {
          background-color: #f8f9fa;
        }

        .virtual-list-content-wrap {
          display: flex;
          align-items: center;
          justify-content: space-between;
          width: 100%;
        }

        .item-label {
          font-weight: 500;
          color: #333;
          flex: 1;
          margin-right: 10px;
        }

        .item-data {
          color: #666;
          flex: 1;
          text-align: center;
        }

        /* 按钮样式 */
        .btn {
          padding: 6px 12px;
          border: none;
          border-radius: 4px;
          cursor: pointer;
          transition: all 0.2s ease;
        }

        .delete-btn {
          background-color: #f44336;
          color: white;
          margin-right: 5px;
        }

        .update-btn {
          background-color: #4caf50;
          color: white;
        }

        .delete-btn:hover {
          background-color: #d32f2f;
        }

        .update-btn:hover {
          background-color: #43a047;
        }

        /* 隐藏滚动条（截图时使用） */
        .virtual-list::-webkit-scrollbar {
          display: none;
        }
      </style>
    </head>
    <body>
      <div class="virtual-list">
        <div class="virtual-list-content">
          <ul class="virtual-list-ul">
            ${data.map(item => `
              <li class="virtual-list-item">
                <div class="virtual-list-content-wrap">
                  <span class="item-label">${item.name}</span>
                  <span class="item-data">${item.one === 0 ? '第一次考试成绩' : item.one}</span>
                  <span class="item-data">${item.tow === 0 ? '第二次考试成绩' : item.tow}</span>
                  <span class="item-data">${item.thre === 0 ? '第三次考试成绩' : item.thre}</span>
                 
                </div>
              </li>
            `).join('')}
          </ul>
        </div>
      </div>
    </body>
    </html>
  `;
}
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});
router.post('/getUser', async (req, res) => {
    try {
        let { username, password } = req.body;
        console.log(username);

        // 1. 查询用户信息
        const user = await getUserByUsername(username);
        if (!user || user.password!== password) {
            return res.send({ code: 400, msg: '用户名或密码错误' });
        }
        console.log(user.user_id);
        // 2. 查询用户角色信息（包含 role_id）
        const [roleRows] = await pool.execute(`
            SELECT 
                u.username,
                u.password,
                r.role_name,
                r.role_id  -- 必须查询 role_id
            FROM 
                user u
            JOIN 
                user_role ur ON u.user_id = ur.user_id
            JOIN 
                role r ON ur.role_id = r.role_id
            WHERE 
                u.user_id = ?
        `, [user.user_id]);
        if (roleRows.length === 0) {
            return res.send({ code: 400, msg: '用户角色信息不存在' });
        }

        // 3. 提取角色 ID 数组
        const roleIds = roleRows.map(row => row.role_id);

        // 4. 构建动态占位符（解决 MySQL 低版本不支持数组参数问题）
        const placeholders = roleIds.map(() => '?').join(','); // 如 [1,2] → "?,?"

        // 5. 查询权限信息（使用动态占位符）
        const [qxRows] = await pool.execute(`
            SELECT 
                qx.name 
            FROM 
                roleqx rq
            JOIN 
                qx ON rq.qx_id = qx.qx_id
            WHERE 
                rq.role_id IN (${placeholders})  -- 动态插入占位符
        `, roleIds); // 直接传递数组

        // 6. 格式化结果
        const sj = {
            username: roleRows[0].username,
            // password: roleRows[0].password,  // 生产环境删除此行
            rolename: roleRows.map(row => row.role_name),
            permissions: qxRows.map(row => row.name)
        };
        console.log(sj);

        res.send({ code: 200, sj });

    } catch (error) {
        console.error('数据库错误:', error);
        res.send({ code: 500, msg: '服务器内部错误' });
    }
});
// router.post('/add', async (req, res) => {
//     const browser = await puppeteer.launch();
//     //创建浏览器标签页
//     const page = await browser.newPage();
//     //打开页面
//     await page.goto('http://localhost:5173/index/gg');
//    //加载完页面后截图
//   const base64dada=  await page.screenshot({
//         path: 'screenshot.png',
//         encoding:'base64',
//         fullPage: true
//     })
//     console.log(base64dada);
//     // 截图完成后关闭浏览器实例
// await browser.close();
//     res.send({
//         code: 200,
//         msg: '截图成功',
//         base64:base64dada
//     })
// })





// router.post('/add', async (req, res) => {
//   let browser;
//   try {
//     // 1. 启动浏览器（加参数避免沙盒问题，开可视化调试）
//     browser = await puppeteer.launch({
//       headless: false, // 调试时开可视化，上线再改 true
//       slowMo: 200, 
//       args: ['--no-sandbox', '--disable-setuid-sandbox'],
//     });
//     const page = await browser.newPage();

//     // 2. 跳转登录页 + 输入账号密码
//     await page.goto('http://localhost:5173/login', { timeout: 10000 });
//     await page.type('#username', 'ls');
//     await page.type('#password', '123456');

//     // 3. 点击登录 + 等待跳转（加超时）
//     await Promise.all([
//       page.click('#loginBtn'), 
//       page.waitForNavigation({ timeout: 10000 }), // 并行执行点击和等待
//     ]);

//     // 4. 跳转目标页
//     await page.goto('http://localhost:5173/index/gg', { timeout: 10000 });

//     // 5. 等待数据加载（优先用 waitForFunction 更可靠）
//     await page.waitForFunction(() => {
//       return document.querySelectorAll('.virtual-list-item').length > 0;
//     }, { timeout: 10000 });

//     // 6. 截图（全页）
//     const base64dada = await page.screenshot({
//       encoding: 'base64',
//       fullPage: true,
//     });
//     console.log('Base64 数据长度:', base64dada.length); // 打印长度，验证是否有内容

//     // 7. 返回结果
//     res.send({
//       code: 200,
//       msg: '截图成功',
//       base64: base64dada,
//     });
//   } catch (error) {
//     console.error('截图流程报错:', error);
//     res.status(500).send({
//       code: 500,
//       msg: '截图失败',
//       error: error.message,
//     });
//   } finally {
//     // 确保浏览器一定关闭，避免内存泄漏
//     if (browser) {
//       await browser.close();
//     }
//   }
// });


// // 截图接口
// router.post('/add', async (req, res) => {
//   let browser;
//   let connection;
//   try {
//     // 启动浏览器
//     browser = await puppeteer.launch({
//       headless: true, // 生产环境建议无头模式
//       args: ['--no-sandbox', '--disable-setuid-sandbox'],
//     });
//     const page = await browser.newPage();

//     // 模拟登录（示例，可根据实际情况调整）
//     await page.goto('http://localhost:5173/login', { timeout: 15000 });
//     await page.type('#username', 'ls');
//     await page.type('#password', '123456');
//     await Promise.all([
//       page.click('#loginBtn'),
//       page.waitForNavigation({ timeout: 15000, waitUntil: 'networkidle2' }),
//     ]);

//     // 获取数据库数据
//     connection = await pool.getConnection();
//     const [rows] = await connection.execute('SELECT * FROM cj');

//     // 生成并写入 HTML
//     const data = rows.map(row => ({
//       name: row.name,
//       one: row.one,
//       tow: row.tow,
//       thre: row.thre,
//     }));
//     const tempPath = path.join(__dirname, 'temp.html');
//     fs.writeFileSync(tempPath, generateFullHtml(data));

//     // 加载本地 HTML
//     await page.goto(`file://${tempPath}`, { waitUntil: 'domcontentloaded' });

//     // 滚动到底部并等待（使用原生 setTimeout）
//     await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
//     await new Promise(resolve => setTimeout(resolve, 1000)); // 等待渲染

//     // 截图
//     const base64Data = await page.screenshot({
//       encoding: 'base64',
//       fullPage: true,
//     });

//     // 清理文件
//     fs.unlinkSync(tempPath);

//     res.status(200).json({
//       code: 200,
//       msg: '截图成功',
//       base64: base64Data,
//       count: rows.length,
//     });
//   } catch (error) {
//     console.error('截图失败:', error);
//     res.status(500).json({ msg: '截图失败', error: error.message });
//   } finally {
//     if (connection) connection.release();
//     if (browser) browser.close();
//   }
// });


// 截图接口 - 无需登录版本
router.post('/add', async (req, res) => {
  let browser;
  let connection;
  try {
    // 启动浏览器
    browser = await puppeteer.launch({
      headless: true, // 生产环境建议无头模式
      args: ['--no-sandbox', '--disable-setuid-sandbox'],
    });
    const page = await browser.newPage();

    // 获取数据库数据
    connection = await pool.getConnection();
    const [rows] = await connection.execute('SELECT * FROM cj');

    // 生成并写入 HTML
    const data = rows.map(row => ({
      name: row.name,
      one: row.one,
      tow: row.tow,
      thre: row.thre,
    }));
    const tempPath = path.join(__dirname, 'temp.html');
    fs.writeFileSync(tempPath, generateFullHtml(data));

    // 加载本地 HTML
    await page.goto(`file://${tempPath}`, { waitUntil: 'domcontentloaded' });

    // 滚动到底部并等待（使用原生 setTimeout）
    await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
    await new Promise(resolve => setTimeout(resolve, 1000)); // 等待渲染

    // 截图
    const base64Data = await page.screenshot({
      encoding: 'base64',
      fullPage: true,
    });

    // 清理文件
    fs.unlinkSync(tempPath);

    res.status(200).json({
      code: 200,
      msg: '截图成功',
      base64: base64Data,
      count: rows.length,
    });
  } catch (error) {
    console.error('截图失败:', error);
    res.status(500).json({ msg: '截图失败', error: error.message });
  } finally {
    if (connection) connection.release();
    if (browser) browser.close();
  }
});




router.get('/getsj', async (req, res) => {
  try {
    // 获取数据库连接
    const connection = await pool.getConnection();
    // 执行查询语句，查询cj表所有数据
    const [rows] = await connection.execute('SELECT * FROM cj');
    // 释放连接
    connection.release();
    // 将查询结果返回给前端
    res.send({
      code: 200,
      sj: rows,
      msg: '查询成功'
    });
  } catch (error) {
    console.error('数据库查询错误:', error);
    res.send({
      code: 500,
      msg: '服务器内部错误'
    });
  }
});


// 修改数据接口
router.post('/updatesj', async (req, res) => {
  try {
    // 从请求体中获取要修改的数据
    const { id, xm, xb, nl, kh, cj } = req.body;
    // 获取数据库连接
    const connection = await pool.getConnection();
    
    // 执行更新语句
    const [result] = await connection.execute(
      'UPDATE cj SET xm = ?, xb = ?, nl = ?, kh = ?, cj = ? WHERE id = ?',
      [xm, xb, nl, kh, cj, id]
    );
    
    // 释放连接
    connection.release();
    
    // 检查是否有数据被更新
    if (result.affectedRows === 0) {
      return res.send({
        code: 404,
        msg: '未找到对应ID的数据'
      });
    }
    
    // 返回成功信息
    res.send({
      code: 200,
      msg: '数据修改成功'
    });
  } catch (error) {
    console.error('数据库更新错误:', error);
    res.send({
      code: 500,
      msg: '服务器内部错误'
    });
  }
});

// 删除数据接口
router.post('/deletesj', async (req, res) => {
  try {
    // 从请求体中获取要删除的ID
    const { id } = req.body;
    
    // 检查ID是否存在
    if (!id) {
      return res.send({
        code: 400,
        msg: '缺少必要的ID参数'
      });
    }
    
    // 获取数据库连接
    const connection = await pool.getConnection();
    
    // 执行删除语句
    const [result] = await connection.execute(
      'DELETE FROM cj WHERE id = ?',
      [id]
    );
    
    // 释放连接
    connection.release();
    
    // 检查是否有数据被删除
    if (result.affectedRows === 0) {
      return res.send({
        code: 404,
        msg: '未找到对应ID的数据'
      });
    }
    // 返回成功信息
    res.send({
      code: 200,
      msg: '数据删除成功'
    });
  } catch (error) {
    console.error('数据库删除错误:', error);
    res.send({
      code: 500,
      msg: '服务器内部错误'
    });
  }
});
module.exports = router;
